fscanf関数は、ファイルの内容を書式に従い変換(編集)して、引数で指定した領域に入力します。
#include <stdio.h>
int fscanf(FILE *stream, const char *format, …);
*streamはfopen関数で取得した、ファイルポインタを指定します。
*format(書式)は第3引数以降で指定する領域に入力する値の変換形式を指定します。
第3引数以降は可変引数で、任意の引数を指定できます。ただし、*formatにより、間接的に引数の型名と個数を指定することになります。fscanf関数がこれらの領域に入力した値を設定しますので、引数は参照渡し(call by reference)になります。
戻り値として、入力した要素の個数を返します。また、ファイルの終わりや、エラーの場合はEOFの値を返します。
*format(書式)は%(パーセント)記号で始まり、「代入抑止フラグ」、「最大フィールド幅」、「長さ指定子」、「変換指定子」が続きます。%と変換指定子以外は省略可能です。
代入抑止フラグは*(アスタリスク)記号で指定します。データは入力しますが、捨ててしまいます。第3引数以降に指定した変数に値を設定しませんので、引数(格納変数)を指定する必要は有りません。
最大フィールド幅は十進整数値で、入力する文字数の最大値を指定します。この値に達するか、一致しない文字が現れるまで読み込みます。ほとんどの変換では、先頭のホワイトスペース(スペースやタブ、等)やヌル文字(’\0’)は最大フィールド幅には含みません。
長さ指定子は数値を表す変換指定子に対して指定でき、次のような意味があります。
- hはshort型を表します。
- l(小文字のL)は整数への変換入力の場合は、long int型かunsigned long int型を表し、十進浮動少数点実数への変換入力の場合は、double型を表します。
- Lは整数への変換入力の場合は、long long型を表し、十進浮動少数点実数への変換入力の場合は、long double型を表します。
変換指定子は変換の型を指定します。変換指定子には下表のようなものがあります。
| 変換指定子 | 型名 | 意味 |
|---|---|---|
| c | char | 通常は1文字を入力します。ただし、最大フィールド幅を指定すれば、指定した分の文字を入力します。なお、入力ストリーム中のホワイトスペースは入力します。入力したく無い場合は、書式制御文字列中に明示的にスペースを指定します。 |
| d | int | 符号つき十進整数として入力します。long型に入力する場合は、長さ指定子のl(小文字のL)を、long long型に入力する場合はLを付加します。 |
| f | float | 符号つき浮動小数点実数値として入力します。double型に入力する場合は、長さ指定子のl(小文字のL)を、long double型に入力する場合はLを付加します。(e、E、gも同じです。) |
| i | int | 0x又は、0Xで始まる場合は十六進数、0で始まる場合は八進数、その他の場合は十進数値として入力します。 |
| n | int | ここまでに入力された文字数を保存します。 |
| o、u、x、X | unsigned int | 符号なし八進数(o)、符号なし十進数(u)、符号なし十六進数(xとX)として入力します。 |
| p | void * | ポインタ値として入力します。 |
| s | char[] | 文字列として入力します。入力した文字列の終端にはヌル文字(’\0’)が追加されます。なお、入力ストリーム中に、ホワイトスペースが現れるか、最大フィールド幅に達した場合は文字列の入力は停止します。 |
| [文字列] | char[] | 「文字列」中の文字に一致した文字又は、不一致の文字を文字列として入力します。「文字列」の先頭に^(やま)記号を付けると、不一致を意味します。また、連続した文字の中の1文字は-(マイナス)記号で指定ができます。(例えば、英大文字ならば[A-Z]の様に指定できます。) |
次の例題プログラムは肥満度(BMI)情報を格納したtemp_2.txtファイル(固定長テキストレコード形式)を入力して、肥満度情報を出力します。ちなみに、temp_2.txtファイルには番号(3文字の整数)、身長と体重及び、肥満度(各7文字の十進浮動少数点数で小数点以下2位まで)が格納されています。
プログラム 例
#include <stdio.h>
int main()
{
FILE *fp;
int number; /* 番号 */
double weight; /* 体重 */
double height; /* 身長 */
double bmi; /* 肥満度 */
int return_code = 0;
if ((fp = fopen('temp_2.txt', 'r')) != NULL) {
while(fscanf(fp, '%3d%7lf%7lf%7lf',
&number, &weight, &height, &bmi) != EOF) {
printf('%03d番目\n', number);
printf('\t体重:%.2fKg\n', weight);
printf('\t身長:%.2fCm\n', height);
printf('\t肥満度(BMI):%.2f\n', bmi);
}
fclose(fp);
}
else {
printf('ファイルのオープンに失敗しました\n');
return_code = 1;
}
return return_code;
}
例の実行結果
$ cat temp_2.txt
0010067.500175.500021.92
0020088.000187.800024.95
0030054.300164.000020.19
$
$ ./fscanf.exe
001番目
体重:67.50Kg
身長:175.50Cm
肥満度(BMI):21.92
002番目
体重:88.00Kg
身長:187.80Cm
肥満度(BMI):24.95
003番目
体重:54.30Kg
身長:164.00Cm
肥満度(BMI):20.19
$